#include <bits/stdc++.h>
using namespace std;
template<typename T>void read(T &x){
    x=0;char c=getchar();int f=1;
    for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
    x*=f;
}

const int maxn=1e5+10;
int n,m,L,V;
int p[maxn];
struct car{
    int d,v,a;
}c[maxn];
struct node{
    int l,r;
};
node h[maxn];int top=0;
int opn[maxn],up=0;

bool cmp(car x,car y)
{
    return x.d<y.d;
}

bool cmp2(node x,node y)
{
    return x.r<y.r;
}

void solve()
{
    top=0;up=0;
    read(n);read(m);read(L);read(V);
    for(int i=1;i<=n;i++)
    {
        read(c[i].d);read(c[i].v);read(c[i].a);
    }
    sort(c+1,c+n+1,cmp);
    for(int i=1;i<=m;i++)
    {
        read(p[i]);
    }
    for(int i=1;i<=n;i++)
    {
        int d=c[i].d,v=c[i].v,a=c[i].a;
        if(a==0)
        {
            if(v>V)
            {
                int j=lower_bound(p+1,p+m+1,d)-p;
                if(j!=m+1)
                {
                    h[++top].l=j;
                    h[top].r=m;
                }
            }
        }
        else if(a>0)
        {
            if(v>V)
            {
                int j=lower_bound(p+1,p+m+1,d)-p;
                if(j!=m+1)
                {
                    h[++top].l=j;
                    h[top].r=m;
                }
                continue;
            }
            int dis=floor((1.0*V*V-1.0*v*v)/(2.0*a));
            int j=upper_bound(p+1,p+m+1,d+dis)-p;
            if(j!=m+1)
            {
                h[++top].l=j;
                h[top].r=m;
            }
        }
        else
        {
            if(v>V)
            {
                int j1=lower_bound(p+1,p+m+1,d)-p;
                int dis=ceil((1.0*V*V-1.0*v*v)/(2.0*a));
                int j2=lower_bound(p+1,p+m+1,d+dis)-p;
                if(j1!=j2)
                {
                    h[++top].l=j1;
                    h[top].r=j2-1;
                }
            }
        }
    }
    printf("%d ",top);
    sort(h+1,h+top+1,cmp2);
    for(int i=1;i<=top;i++)
    {
        if(lower_bound(opn+1,opn+up+1,h[i].l)-opn==up+1)
        {
            opn[++up]=h[i].r;
        }
    }
    printf("%d\n",m-up);
//    for(int i=1;i<=up;i++)printf("%d ",opn[i]);puts("");
}

int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int _;read(_);
    while(_--)
    {
        solve();
    }
    return 0;
}
